package com.opcode.costatablet.ui.splashscreen;

import android.content.Intent;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.opcode.costatablet.R;
import com.opcode.costatablet.ui.dashboard.leftmenu.KitchenLeftMenuActivity;
import com.opcode.nebulamobil.base.activities.FragmentActivityBase;
import com.opcode.nebulamobil.base.components.TextViewBase;
import com.opcode.nebulamobil.base.fragments.ResponsiveFragmentBase;
import com.opcode.nebulamobil.information.ApplicationInfo;
import com.opcode.nebulamobil.information.dataforms.costadataforms.ConnectionStatus;
import com.opcode.nebulamobil.information.dataforms.costadataforms.SettingsDataForm;
import com.opcode.nebulamobil.information.requests.costarequests.OrderListUpdateReq;
import com.opcode.nebulamobil.information.responses.JSONResponse;
import com.opcode.nebulamobil.information.responses.costaresponses.ActivationResp;
import com.opcode.nebulamobil.information.responses.costaresponses.OrderListUpdateResp;
import com.opcode.nebulamobil.utility.FileProcess;
import com.opcode.nebulamobil.utility.JsonConverter;
import com.opcode.nebulamobil.utility.STSFileManager;
import com.opcode.nebulamobil.utility.STSLog;
import com.opcode.nebulamobil.utility.UniqueIdCreator;


/**
 * Splash ekranına ait lojik işlemlerin yapılacağı esas fonksiyonların yer aldığı sınıftır.
 * @author Okan ERDOĞAN
 *
 * 21 Tem 2014
 */
public class KitchenSplashFragment extends ResponsiveFragmentBase{

	//Referanslar
	private View vi;
	private TextViewBase loadingText;
	private ConnectionStatus status;
	private FileProcess fileProcess;
	private Intent intent;
	
	
	/**
	 * Bir fragment'in yaşam döngüsünde ilk olarak tetiklenen metoddur.
	 * Bu metod içerisinde fragment'a ait view nesneleri referanslar bağlanırlar.
	 * Ayrıca uygulamada kullanılacak nesneler oluşturulurlar.
	 */
	public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
		this.vi = inflater.inflate(R.layout.kitchen_splash_fragment_layout, container,false);
		ApplicationInfo.setResponsiveFragmentBase(this);

		/*
		 * Görsel öğeler referanslara bağlanıyorlar.
		 */
		this.loadingText=(TextViewBase) this.vi.findViewById(R.id.loading_text);
		
		/*
		 * Dosya işlemlerinde sorumludur.
		 * Settings verilerini dosyaya yazar.
		 */
		this.fileProcess = new FileProcess(Environment.getExternalStorageDirectory()+"//settings.txt");

		this.intent=new Intent(new Intent(getActivity(),KitchenLeftMenuActivity.class));

		if(!this.checkSettingsFile()){
			Log.i("KitchenSplashFragment", "Settings dosyasında veri bulunamadı.");
		}
		return this.vi;
	}
	
	
	/**
	 * Bu metod içerisinde listener kayıtları yapılıyor.
	 */
	public void onResume(){
		super.onResume();

		//ApplicationInfo.setResponseListener(this);

	}
	
	
	/**
	 * Aktivite kapatılıp bir başka aktiviteye geçildiğinde bu metod tetiklenir.
	 * Açılan yeni aktiviteden geri dönüşte ise onResume metod tetiklenecektir.
	 */
	 public void onPause(){
	    	super.onPause();

	 }
	
	
	/**
	 * Cihaza kayıt edilmiş olan ayarlar dosyasındaki verinin olup olmadığını kontrol eder.
	 * Eğer bir dosya bulamazsa geriye false dönerek dosya oluşturulmasını ister.
	 * Eğer dosyayı bulmuş ve bu dosyanın içerisinde ip ve port değerleri varsa ilgili değerleri sharedpreferences'a kayıt eder.
	 * @return
	 */
	private boolean checkSettingsFile(){
		String settingsData=fileProcess.reader();
		STSFileManager.setFileOperator(fileProcess);

		if(settingsData!=""){
			SettingsDataForm settingsInfo=new SettingsDataForm();
			
			settingsData = settingsData.replaceAll("\\r|\\n", "");
			
			settingsInfo.setServerIp(settingsData.split(":")[0]);
			settingsInfo.setServerPort(Integer.parseInt(settingsData.split(":")[1]));

			System.out.println(settingsInfo.getServerIp()+":"+settingsInfo.getServerPort());

			((FragmentActivityBase)getActivity()).createSharedPreferencesManager("sharedpreferences",getActivity());

			((FragmentActivityBase)getActivity()).writeToSharedPreferences("settingsInfo", JsonConverter.toJsonString(settingsInfo));
			return true;
		}else{
			return false;
		}	
	}
	
	
	/**
	 * Eğer sunucu tarafından aktivasyon işleminin başarılı olduğu bildirilirse bu metod çağrılır.
	 */
	public void createRequest(){
		OrderListUpdateReq orderListUpdateReq=new OrderListUpdateReq();
		orderListUpdateReq.setType("OrderListUpdateReq");
		orderListUpdateReq.setRequestId(UniqueIdCreator.createUniqueID());
		ApplicationInfo.getRequestListener().jsonRequestCame(JsonConverter.toJsonString(orderListUpdateReq));
		Bundle data=new Bundle();
		data.putString("orderListUpdateReq", JsonConverter.toJsonString(orderListUpdateReq));
	}

	/**
	 * ConnectionService sunucudan bir response aldığında bu metod tetiklenir.
	 */
	@Override
	public void responseCame(String response) {
		
		JSONResponse responseObject=(JSONResponse) JsonConverter.fromJsonString(response, JSONResponse.class);

		if(responseObject.getType().equals("ActivationResp")){
			ActivationResp activationResp=(ActivationResp) JsonConverter.fromJsonString(response, ActivationResp.class);
			if(activationResp.isActResult()){
				Log.i("SplashFragment", "Aktivasyon onaylandı.Personel listesi alınıyor.");

				try {
					Thread.sleep(1000);
				} catch (InterruptedException e) {
					STSLog.writeLog(e,this.getClass().getCanonicalName(),"Thread 1 sn. uyutulurken hata alındı.");														
				}
				
				if(activationResp.getDeviceName()!=null){
					intent.putExtra("DeviceName", activationResp.getDeviceName());
				}else{
					intent.putExtra("DeviceName", "Mutfak adı bilinmiyor.");
				}

				createRequest();
			}else{
				if(activationResp.getActMessage()!=null){
					Log.i("SplashFragment",activationResp.getActMessage() );
				}
			}
		}else if(responseObject.getType().equals("OrderListUpdateResp")){
			OrderListUpdateResp orderListUpdateResp=(OrderListUpdateResp) JsonConverter.fromJsonString(response, OrderListUpdateResp.class);
			intent.putExtra("OrderListUpdateResp", orderListUpdateResp);
			startActivity(intent);
		}
		
	}
	
	
}
